<?php
class LcznBD {
	
	public static function cargaModelo() {
		
		//if (!isset($_SESSION["carga"]["modelo"]) || !$_SESSION["carga"]["modelo"]) {

			$sql = "SHOW tables";
			$res = Dao::ejecuta($sql);
			
			$res->fetchAll(PDO::FETCH_FUNC, "LcznBD::tablaBD");
			
			$_SESSION["carga"]["modelo"] = true;
		//}
		
			//Util::depura($_SESSION["modelo"]["aux_grados"]["relaciones"]);
	}
	
	public static function tablaBD($tabla) {
		$infoEntidad = LcznBD::infoEntidad($tabla);

		if (isset($_SESSION["modelo"][$tabla]["relaciones"])) {
			array_merge($_SESSION["modelo"][$tabla],$infoEntidad);
		} else {
			$_SESSION["modelo"][$tabla] = $infoEntidad;
		}
		
		foreach ($infoEntidad["fks"] as $fk) {
			if (!isset($_SESSION["modelo"][$fk[3]]["relaciones"]) || !in_array($tabla, $_SESSION["modelo"][$fk[3]]["relaciones"])) {
				$_SESSION["modelo"][$fk[3]]["relaciones"][] = $tabla;
			}
		}
	}

	public static function infoEntidad($nombre) {
	
		$info = null;
	
		$sql = "SHOW CREATE TABLE `$nombre`;";

		$res = Dao::ejecuta($sql);
	
		if (!is_null($res)) {
			$fila = $res->fetch();
			$tabla = $fila["Create Table"];
	
			preg_match_all("/`(.+)` (.[^ (`]+)\(?([0-9]+)?\)? ?(UNSIGNED)? ?(ZEROFILL)? ?(COLLATE (.[^ ]+))? ?(NOT NULL)? ?(DEFAULT ('.+'|.[^ ]+))? ?(AUTO_INCREMENT)? ?(COMMENT '(.+)')?(,)/i",$tabla, $columnas, PREG_SET_ORDER);
			
			preg_match_all("/PRIMARY KEY \(`(.+)`\)/i", $tabla, $aux);
			$claves = explode("`,`",$aux[1][0]);

			preg_match_all("/CONSTRAINT `(.+)` FOREIGN KEY \(`(.+)`\) REFERENCES `(.+)` \(`(.+)`\)/i", $tabla, $fks, PREG_SET_ORDER);

			foreach($fks as $fk) {
				$relacion[$fk[2]] = array("tabla"=>$fk[3], "campo"=>$fk[4]);
			}
			
			foreach ($columnas as $columna) {
				$campo = new Campo();
				$campo->setClave(in_array($columna[1], $claves));
				$campo->setNombre($columna[1]);
				$campo->setTipo($columna[2]);
				$campo->setTamano($columna[3]);
				$campo->setNulo($columna[8]);
				switch($columna[10]) {
					case "NULL":
						$campo->setDefecto("");
						break;
					case "CURRENT_TIMESTAMP":
						$campo->setDefecto(date("Y-m-d H:i:s"));
						break;
					default:
						$campo->setDefecto(trim($columna[10],"'"));
						break;
				}
				
				if (isset($relacion[$columna[1]])) {
					$campo->setRelacion($relacion[$columna[1]]);
				}
				$campos[] = $campo;
			}

			$claves = array_fill_keys($claves,"-1");
			$info = array("campos"=>$campos, "claves"=>$claves, "fks"=>$fks);
		}
	
		$res = null;
	
		return $info;
	}
}
?>